Generic Singleton Factory Method এমন একটি প্যাটার্ন যেখানে একটি সিঙ্গলটন অবজেক্ট তৈরি এবং প্রদান করা হয়, যা জেনেরিক টাইপ ব্যবহার করে টাইপ-সেইফটি নিশ্চিত করে। এটি বিশেষত কোডের পুনঃব্যবহারযোগ্যতা বাড়ায় এবং টাইপ সংক্রান্ত ত্রুটি কমায়।
public class SingletonFactory {
// Private static instance (generic)
private static final SingletonFactory INSTANCE = new SingletonFactory();
// Private constructor to prevent instantiation
private SingletonFactory() {}
// Generic Factory Method
public static <T> T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException {
return clazz.newInstance();
}
}
public class Main {
public static void main(String[] args) {
try {
// Getting instances of different classes
String strInstance = SingletonFactory.getInstance(String.class);
Integer intInstance = SingletonFactory.getInstance(Integer.class);
System.out.println("String Instance: " + strInstance);
System.out.println("Integer Instance: " + intInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
String Instance:
Integer Instance: 0
কখনও কখনও পূর্বনির্ধারিত ইনস্ট্যান্স ব্যবহার করে টাইপ অনুযায়ী সিঙ্গলটন তৈরি করা হয়। উদাহরণস্বরূপ:
import java.util.HashMap;
import java.util.Map;
public class SingletonFactory {
// Map to store singletons
private static final Map<Class<?>, Object> instances = new HashMap<>();
static {
instances.put(String.class, "");
instances.put(Integer.class, 0);
instances.put(Double.class, 0.0);
}
// Generic Factory Method
@SuppressWarnings("unchecked")
public static <T> T getInstance(Class<T> clazz) {
return (T) instances.get(clazz);
}
}
public class Main {
public static void main(String[] args) {
// Getting predefined instances
String str = SingletonFactory.getInstance(String.class);
Integer num = SingletonFactory.getInstance(Integer.class);
Double dbl = SingletonFactory.getInstance(Double.class);
System.out.println("String Instance: " + str);
System.out.println("Integer Instance: " + num);
System.out.println("Double Instance: " + dbl);
}
}
String Instance:
Integer Instance: 0
Double Instance: 0.0
import java.util.concurrent.ConcurrentHashMap;
public class ThreadSafeSingletonFactory {
private static final ConcurrentHashMap<Class<?>, Object> instances = new ConcurrentHashMap<>();
// Generic Factory Method
public static <T> T getInstance(Class<T> clazz) {
return (T) instances.computeIfAbsent(clazz, cls -> {
try {
return cls.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
}
public class Main {
public static void main(String[] args) {
String str1 = ThreadSafeSingletonFactory.getInstance(String.class);
String str2 = ThreadSafeSingletonFactory.getInstance(String.class);
Integer num1 = ThreadSafeSingletonFactory.getInstance(Integer.class);
Integer num2 = ThreadSafeSingletonFactory.getInstance(Integer.class);
System.out.println("String Instances are same: " + (str1 == str2));
System.out.println("Integer Instances are same: " + (num1 == num2));
}
}
String Instances are same: true
Integer Instances are same: true
Read more